home *** CD-ROM | disk | FTP | other *** search
/ Delphi Developer's Kit 1996 / Delphi Developer's Kit 1996.iso / power / colbox / coolbox.pas < prev    next >
Pascal/Delphi Source File  |  1995-12-22  |  5KB  |  149 lines

  1. {A note from the author:
  2.  
  3.    I needed to do some spiffy things with the listboxes so I wrote this.  If it
  4. already exists, then great, but I couldn't find it.  With this small program,
  5. you can multi-select items from ListBox1 and drag them to ListBox2.
  6. No big deal, except that you can INSERT a selected item into a specific spot
  7. in the list.
  8.  
  9.    The really cool thing here is that you can select an item in ListBox2 and
  10. move it into a another spot within the list by using the arrows or by dragging
  11. and dropping.  Again, I couldn't find any code that already did this.  I hope
  12. you find this code useful, and if you do any other cool things with it, please
  13. let me know.  This code is only lightly documented, so if you have any
  14. questions, jsut ask.  One reason for the length of this program is that
  15. it is relatively (dare I say it?) bug-free.  I'll probably pay for that claim.
  16.  
  17. Richard Howard 71553,2544
  18. Mei Technology Corporation
  19. 26 August 1995}
  20.  
  21. unit CoolBox;
  22.  
  23. interface
  24.  
  25. uses
  26.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  27.   Forms, Dialogs, StdCtrls, Buttons;
  28.  
  29. type
  30.   TForm1 = class(TForm)
  31.     ListBox1: TListBox;
  32.     ListBox2: TListBox;
  33.     BitBtn1: TBitBtn;
  34.     BitBtn2: TBitBtn;
  35.     procedure ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
  36.       State: TDragState; var Accept: Boolean);
  37.     procedure ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
  38.     procedure ListBox2MouseDown(Sender: TObject; Button: TMouseButton;
  39.       Shift: TShiftState; X, Y: Integer);
  40.     procedure ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  41.       State: TDragState; var Accept: Boolean);
  42.     procedure FormCreate(Sender: TObject);
  43.     procedure BitBtn1Click(Sender: TObject);
  44.     procedure BitBtn2Click(Sender: TObject);
  45.   private
  46.     { Private declarations }
  47.   public
  48.     { Public declarations }
  49.   end;
  50.  
  51. var
  52.   Form1: TForm1;
  53.   MoveSelectedItem : Integer; {the item in ListBox2 being moved}
  54.   DnListBox1 : Boolean; {indicates which listbox to work with}
  55.   DnListBox2 : Boolean; {indicates which listbox to work with}
  56.  
  57. implementation
  58.  
  59. {$R *.DFM}
  60.  
  61. procedure TForm1.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
  62.   State: TDragState; var Accept: Boolean);
  63. begin
  64.   if (Source is TListBox) then Accept := True;
  65.   {because this is such a small program, 'ACCEPT := True' would work.  But
  66.   larger programs need a little more control.}
  67. end;
  68.  
  69. procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
  70. var
  71.   i : Integer; {serves two purposes: 1) a counting variable for ListBox1,
  72.                and 2) the item that the SELECTED item is being dropped on to
  73.                in ListBox 2}
  74. begin {procedure}
  75.   {instructions for moving items from ListBox1 to ListBox2}
  76.   if DnListBox1 then
  77.   begin {if 1}
  78.     for i := 0 to ListBox1.Items.Count - 1 do {look at ALL items in ListBox1}
  79.     begin {for}
  80.       if ListBox1.Selected[i] then
  81.         ListBox2.Items.Insert(ListBox2.ItemAtPos(Point(X,Y), True)
  82.           ,ListBox1.Items[i]);
  83.         ListBox1.Selected[i] := False; {after copying to LB2, UNselect it}
  84.     end; {for}
  85.    DnListBox1 := False;
  86.   end; {if 1}
  87.  
  88.   {instructions for moving an item WITHIN ListBox2}
  89.   if DnListBox2 then
  90.   begin {if 2}
  91.     {i = the item UNDER the moving, selected item}
  92.     i := ListBox2.ItemAtPos(Point(X, Y), True);
  93.     ListBox2.Items.Move(MoveSelectedItem, i); {puts the moved item into place}
  94.     ListBox2.ItemIndex := i; {select (highlight) the item you moved}
  95.     if i = -1 then ListBox2.ItemIndex := ListBox2.Items.Count-1;
  96.     DnListBox2 := False;
  97.   end; {if 2}
  98. end; {procedure}
  99.  
  100. procedure TForm1.ListBox2MouseDown(Sender: TObject; Button: TMouseButton;
  101.   Shift: TShiftState; X, Y: Integer);
  102. begin {procedure}
  103.   DnListBox1 := False;{tells the OnDragDrop procedure which instructions to use}
  104.   DnListBox2 := True;{tells the OnDragDrop procedure which instructions to use}
  105.   if Button = mbLeft then
  106.     if ListBox2.ItemAtPos(Point(X, Y), True) >= 0 then
  107.       MoveSelectedItem := ListBox2.ItemIndex;
  108. end; {procedure}
  109.  
  110. procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  111.   State: TDragState; var Accept: Boolean);
  112. begin
  113.   DnListBox1 := True;
  114. end;
  115.  
  116. procedure TForm1.FormCreate(Sender: TObject);
  117. begin
  118.   {I just threw these in here to look nice.  They can be pretty handy.}
  119.   SendMessage(ListBox1.Handle, LB_SetHorizontalExtent, 1000, LongInt(0));
  120.   SendMessage(ListBox2.Handle, LB_SetHorizontalExtent, 1000, LongInt(0));
  121. end;
  122.  
  123. procedure TForm1.BitBtn1Click(Sender: TObject);
  124. var
  125.   i : Integer;
  126. begin {procedure}
  127.   if ListBox2.ItemIndex > 0 then
  128.   begin {if}
  129.     i := ListBox2.ItemIndex;
  130.     ListBox2.Items.Move(i, i-1);
  131.     ListBox2.ItemIndex := i-1;
  132.   end; {if}
  133. end; {procedure}
  134.  
  135. procedure TForm1.BitBtn2Click(Sender: TObject);
  136. var
  137.   i : Integer;
  138. begin {procedure}
  139.   if (ListBox2.ItemIndex < ListBox2.Items.Count-1) and
  140.      (ListBox2.ItemIndex <> -1) then
  141.   begin {if}
  142.     i := ListBox2.ItemIndex;
  143.     ListBox2.Items.Move(i, i+1);
  144.     ListBox2.ItemIndex := i+1;
  145.   end; {if}
  146. end; {procedure}
  147.  
  148. end.
  149.